<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      // 检测js数据类型的方式常见的有四种

      /*





      1. typeof
      用typeof检测的类型有两个问题
      基本类型除了null可以准确显示类型，但是null的类型是object
      复杂类型除了函数显示function，其他的都显示object
      所以不能使用检测一个数据是否是null，也不能区分对象数组等
      console.log("11:" + typeof 11);
      console.log("22:" + typeof "22");
      console.log("true:" + typeof true);
      console.log("undefined:" + typeof undefined);
      console.log("null:" + typeof null);
      console.log("[1,2,3]:" + typeof [1, 2, 3]);
      console.log("{a: 3}:" + typeof { a: 3 });
      console.log("funtion:" + typeof new Function());
      console.log("date:" + typeof new Date());
      console.log("regexp:" + typeof new RegExp());
      */

      /*





      2. instanceof
      instanceof 是用来检测一个对象是否是某个构造函数的实例,返回true后者false
      console.log([] instanceof Array);
      console.log({} instanceof Object);
      console.log(new Function() instanceof Function);
      console.log(new Date() instanceof Date);

      class Person {}
      const person = new Person();
      console.log(person instanceof Person);

      class Object {}
      class Array extends Object {}
      */

      /*





      3. constructor
      constructor 属性可以用来获取一个对象的构造函数。每个对象都有一个 constructor 属性，指向创建该对象的构造函数。
      null 和 undefined 是无效的对象，因此是不会有 constructor 存在的，这两种类型的数据需要通过其他方式来判断。
      // class Person {}
      // let person = new Person();
      // console.log(person.constructor === Person);

      // console.log([1, 2, 3].constructor === Array);
      // console.log({ a: 3 }.constructor === Object);
      // console.log([1, 2, 3].constructor === Object); // false
      // console.log(new Number(1).constructor === Number);
      // console.log(new Boolean(true).constructor === Boolean);
      // console.log(null.constructor === Null);
      */

      /*





      
      4. Object.prototype.toString.call()
      console.log(Object.prototype.toString.call("")); // [object String]
      console.log(Object.prototype.toString.call(1)); // [object Number]
      console.log(Object.prototype.toString.call(true)); // [object Boolean]
      console.log(Object.prototype.toString.call(Symbol())); //[object Symbol]
      console.log(Object.prototype.toString.call(undefined)); // [object Undefined]
      console.log(Object.prototype.toString.call(null)); // [object Null]
      console.log(Object.prototype.toString.call(new Function())); // [object Function]
      console.log(Object.prototype.toString.call(new Date())); // [object Date]
      console.log(Object.prototype.toString.call([])); // [object Array]
      console.log(Object.prototype.toString.call(new RegExp())); // [object RegExp]
      console.log(Object.prototype.toString.call(new Error())); // [object Error]
      console.log(Object.prototype.toString.call(document)); // [object HTMLDocument]
      console.log(Object.prototype.toString.call(window)); //[object global] window 是全局对象 global 的引用
      */



      // 如果只是想检测一个变量是否是数组，可以直接用Array.isArray方法
      console.log(Array.isArray([1,3,4]));
      
    </script>
  </body>
</html>
